package jp.co.dailyReport.search;

import java.util.ArrayList;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import jp.co.dailyReport.ExecuterManager;
import jp.co.dailyReport.ConnectionFactory;
import jp.co.dailyReport.DataUnavailableException;
import jp.co.dailyReport.search.SearchDailyReport;
import jp.co.dailyReport.search.sql.SearchDailyReportLoadExecuter;
import jp.co.dailyReport.staff.Staff;
import jp.co.dailyReport.dailyReport.DailyReport;
import jp.co.dailyReport.dailyReport.DailyReportManager;
import jp.co.dailyReport.dailyReport.DailyReportWorkItemManager;
import jp.co.dailyReport.PermissionManager;

/**
 * 日報検索結果情報管理クラス
 */
public class SearchDailyReportManager {

	private static Logger log = Logger.getLogger(SearchDailyReportManager.class);

	//社員クラス
	private Staff staff;
	//キーワード
	private String keyWord;
	//プロジェクトID
	private Integer projectId;
	//作業項目ID
	private Integer workItemId;
	//社員ID
	private Integer staffId;
	//雇用形態
	private Integer employmentSystem;
	//検索開始作業日
	private String startWorkDate;
	//検索終了作業日
	private String endWorkDate;
	//作業内容詳細
	private String workDetail;
	//問題点
	private String problem;
	//TODO
	private String toDo;
	//感想
	private String comment;

	public SearchDailyReportManager() {}

	/**
	 * 社員クラスを設定します。
	 * 
	 * @param staff 社員オブジェクト
	 */
	public void setStaff(Staff staff) {
		this.staff = staff;
	}

	/**
	 * キーワードを設定します。
	 * 
	 * @param keyWord キーワード
	 */
	public void setKeyWord(String keyWord) {
		this.keyWord = keyWord;
	}

	/**
	 * プロジェクトIDを設定します。
	 * 
	 * @param projectId プロジェクトID
	 */
	public void setProjectId(int projectId) {
		this.projectId = new Integer(projectId);
	}

	/**
	 * 作業項目IDを設定します。
	 * 
	 * @param workItemId 作業項目ID
	 */
	public void setWorkItemId(int workItemId) {
		this.workItemId = new Integer(workItemId);
	}

	/**
	 * 社員IDを設定します。
	 * 
	 * @param staffId 社員ID
	 */
	public void setStaffId(int staffId) {
		this.staffId = new Integer(staffId);
	}

	/**
	 * 雇用形態IDを設定します。
	 * 
	 * @param employmentSystem 雇用形態ID
	 */
	public void setEmploymentSystem(int employmentSystem) {
		this.employmentSystem = new Integer(employmentSystem);
	}

	/**
	 * 検索開始作業日を設定します。
	 * 
	 * @param startWorkDate 検索開始作業日
	 */
	public void setStartWorkDate(String startWorkDate) {
		this.startWorkDate = startWorkDate;
	}

	/**
	 * 検索終了作業日を設定します。
	 * 
	 * @param endWorkDate 検索終了作業日
	 */
	public void setEndWorkDate(String endWorkDate) {
		this.endWorkDate = endWorkDate;
	}

	/**
	 * 社員の権限で日報検索結果情報を取得します。
	 * 
	 * @return 日報検索結果オブジェクトの配列
	 * @throws DataUnavailableException
	 */
	public SearchDailyReport[] load() throws DataUnavailableException {

        ConnectionFactory connectionFactory = new ConnectionFactory();
        SearchDailyReportLoadExecuter dailyReportLoadExecuter = new SearchDailyReportLoadExecuter();
        Object objs[] = (Object[])null;
		SearchDailyReport[] searchDailyReports = (SearchDailyReport[])null;
		ArrayList answer = new ArrayList();

        try {
			/* 検索条件設定 */
			/* キーワード */
			dailyReportLoadExecuter.setKeyWord(keyWord);
			/* プロジェクト名 */
			dailyReportLoadExecuter.setProjectId(projectId.intValue());
			/* 作業項目 */
			dailyReportLoadExecuter.setWorkItemId(workItemId.intValue());
			/* 氏名 */
			dailyReportLoadExecuter.setStaffId(staffId.intValue());
			/* 雇用形態 */
			dailyReportLoadExecuter.setEmploymentSystem(employmentSystem.intValue());
			/* 検索期間 */
			dailyReportLoadExecuter.setStartWorkDate(startWorkDate);
			dailyReportLoadExecuter.setEndWorkDate(endWorkDate);

            objs = ExecuterManager.execute(connectionFactory, dailyReportLoadExecuter);
        } catch(SQLException sqle) {
			throw new DataUnavailableException(sqle.toString());
		}

		if (objs == null || objs.length == 0) objs = new SearchDailyReport[0];
		searchDailyReports = (SearchDailyReport[])objs;

		for(int i =0; i < searchDailyReports.length;i++){
			DailyReport dailyReport = DailyReportManager.load(searchDailyReports[i].getDailyReportId());
			if(PermissionManager.hasPermission(staff,dailyReport,PermissionManager.METHOD_READ)){

				searchDailyReports[i].setTotalWorkHours(dailyReport.getTotalWorkingHours());
				//その日の休憩時間を取得
				double restTime = DailyReportWorkItemManager.loadRestTime(searchDailyReports[i].getDailyReportId());
				searchDailyReports[i].setRestTime(restTime);
				answer.add(searchDailyReports[i]);
			}
		}
		return (SearchDailyReport[])answer.toArray(new SearchDailyReport[0]);
	}
}
